<?php
class events_model extends CI_Model
{

    function __construct()
    {
        parent::__construct();
    }

    private function sanit($s) {
	return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
    }

    function inserisci_evento_fb($evento) {
        //ipotizzo obbligatoria la presenza di eid, nome, start_time e end_time
        if(!array_key_exists("eid", $evento) || !array_key_exists("name", $evento) ||
                !array_key_exists("start_time", $evento)|| !array_key_exists("end_time", $evento)){
            //restituisce errore;
             return array('state'  =>  "ERROR",
                          'message'=>  "argument passed incomplete");
        }

        $sql = "INSERT INTO ".$this->db->dbprefix("eventi")." (eid, nome, ";
        if(array_key_exists("location", $evento) && $evento["location"]!=null)
            $sql.="location, ";
        if(array_key_exists("description", $evento) && $evento["description"]!=null)
            $sql.="descrizione, ";
        if(array_key_exists("categoria", $evento) && $evento["categoria"]!=null)
            $sql.="categoria, ";
	if(array_key_exists("foto", $evento) && $evento["foto"]!=null)
            $sql.="nome_foto, ";

        if(array_key_exists("address", $evento) && $evento["address"])
            $sql.="indirizzo, ";
        if(array_key_exists("lat", $evento) && $evento["lat"]!=null)
            $sql.="latitude, ";
        if(array_key_exists("lng", $evento) && $evento["lng"]!=null)
            $sql.="longitude, ";

        $sql.="start_time, ";
        $sql.="end_time, ";
        $sql.="data_inserimento, data_aggiornamento, id_importatore )"."
                VALUES (";

        $sql.=$this->db->escape($this->sanit($evento["eid"])).", ";
        $sql.=$this->db->escape($this->sanit($evento["name"])).", ";

        if(array_key_exists("location", $evento) && $evento["location"]!=null)
            $sql.=$this->db->escape($this->sanit($evento["location"])).", ";
        if(array_key_exists("description", $evento) && $evento["description"]!=null)
            $sql.=$this->db->escape($this->sanit($evento["description"])).", ";
	if(array_key_exists("categoria", $evento) && $evento["categoria"]!=null) {
	    $cat = strtolower($this->sanit($evento["categoria"]));
	    // TODO: definire globalmente in qualche modo?
	    //       presente anche in events_from_facebook.php e dozzine di altri posti
	    $categorie = array('pub' => 'Bar, pub, ristoranti', 'disco' => 'Disco', 'concerti' => 'Concerti', 'cinema' => 'Cinema',
		    'cultura' => 'Eventi culturali', 'altro' => 'Altro');
	    if (!array_key_exists($cat, $categorie))
		    return array('state'  =>  "ERROR",
			    'message'=>  "Categoria " . $cat . " errata, evento non importato");
	    $sql.=$this->db->escape($cat).", ";
	}
	if(array_key_exists("foto", $evento) && $evento["foto"]!=null) {
		// TODO: check errori, dimensioni, xss
		$nome_file = uniqid();
		$ch = curl_init($evento["foto"]);
		$fp = fopen('upload/'.$nome_file, 'wb');
		curl_setopt($ch, CURLOPT_FILE, $fp);
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
		curl_setopt($ch, CURLOPT_FAILONERROR, TRUE);
		curl_exec($ch);
		// Prova per limite dimensione file 10 MB
		if (curl_getinfo($ch,CURLINFO_CONTENT_LENGTH_DOWNLOAD) > 10485760) {
			ftruncate($fp);
			unlink('/upload/'.$nome_file);
			$sql.=$this->db->escape("missing.gif").", ";
		} else {
			$sql.=$this->db->escape($nome_file).", ";
		}
		curl_close($ch);
		fclose($fp);
	}

        if(array_key_exists("address", $evento) && $evento["address"])
            $sql.=$this->db->escape($this->sanit($evento["address"])).", ";
        if(array_key_exists("lat", $evento) && $evento["lat"]!=null)
            $sql.=$this->db->escape($this->sanit($evento["lat"])).", ";
        if(array_key_exists("lng", $evento) && $evento["lng"]!=null)
            $sql.=$this->db->escape($this->sanit($evento["lng"])).", ";


        $date = date( 'Y-m-d H:i:s' ,$evento['start_time'] );
        $sql.= "TIMESTAMP '".$date."', ";
        $date = date( 'Y-m-d H:i:s' ,$evento['end_time'] );
        $sql.= "TIMESTAMP '".$date."', ";
        
        //$sql.=$this->db->escape($evento['start_time'] - 9*60*60).", ";
        //$sql.=$this->db->escape($evento["end_time"] - 9*60*60).", ";

        $sql.= "NOW(), ";      //data_inserimento
	$sql.= "NOW(), ";      //data_aggiornamento
	$sql.= $this->db->escape($this->facebook->getUser()) . ")";

        if ($this->db->query($sql)){
            //success
	    return array('state'   =>  "SUCCESS",
	                 'message' => 'Evento importato',
	                 'id'      => $this->db->insert_id());
        }else{
            //error executing the query
            return array('state'  =>  "ERROR",
                         'message'=>  "Errore, evento non importato");
	}
    }

    private function valida_data($s) {
	    // Tutto questo sarebbe banalissimo usando DateTime::createFromFormat, Altervista del c...
	    if (preg_match("/^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})$/", $s, $regs)) {
		    $d = $regs[3];
		    $m = $regs[2];
		    $y = $regs[1];
		    if (!checkdate($m, $d, $y))
			    return FALSE;
		    return mktime(0,0,0,$m,$d,$y);
	    } else return FALSE;
    }

    private function condizione_data($inizio, $fine) {
	    if (!$inizio)
		    return ' (start_time > NOW()) ';
	    $di = $this->valida_data($inizio);
	    $df = $this->valida_data($fine);
	    if (!$di || !$df || !($inizio <= $fine))
		    show_error('Date non valide');
	    $df += 86400; // Per qualche ragione il <= non funziona bene, neanche convertendo
	    return ' ((start_time >= "'.date('Y-m-d',$di).'") AND (start_time < "'.date('Y-m-d',$df).'")) ';
    }
    
    function per_home($inizio, $fine) {
	    $q = 'SELECT * FROM '.$this->db->dbprefix("eventi").' WHERE ';
	    $q .= $this->condizione_data($inizio, $fine);
	    $q .= ' ORDER BY start_time ASC LIMIT 5';
	    return $this->db->query($q);
    }

    function categoria($cat, $inizio, $fine) {
	    $q = 'SELECT * FROM '.$this->db->dbprefix("eventi").' WHERE ';
	    $q .= $this->condizione_data($inizio, $fine);
	    if ($cat)
		    $q .= ' AND (categoria = '.$this->db->escape(strtolower($cat)).')';
	    $q .= ' ORDER BY start_time ASC LIMIT ' . ($this->config->item('mio_max_eventi_per_pagina')+1);
	    return $this->db->query($q);
    }

    function ricerca($testo, $inizio, $fine) {
	    $t = $this->db->escape_like_str($testo);
	    $q = 'SELECT * FROM '.$this->db->dbprefix("eventi").' WHERE ';
	    $q .= $this->condizione_data($inizio, $fine);
	    $q .= ' AND ((nome LIKE "%'.$t.'%") OR (descrizione LIKE "%'.$t.'%"))';
	    $q .= ' ORDER BY start_time ASC LIMIT ' . ($this->config->item('mio_max_eventi_per_pagina')+1);
	    return $this->db->query($q);
    }

    function ricerca_per_autocomplete($testo) {
	    // Restituiamo il minimo indispensabile di dati
	    $t = $this->db->escape_like_str($testo);
	    $this->db->query('SET lc_time_names = "it_IT"'); // Per il formato della data
	    return $this->db->query('SELECT id_evento AS id, nome AS nome, "Evento" AS tipo, DATE_FORMAT(start_time, "%e %M %Y %H:%i") AS info FROM '.$this->db->dbprefix("eventi").' WHERE (start_time > NOW()) AND ((nome LIKE "%' . $t . '%") OR (descrizione LIKE "%'.$t.'%") OR (categoria = "'.$t.'")) ORDER BY start_time ASC LIMIT 4');
    }

    function info_di($id) {
	    return $this->db->query("SELECT * FROM ".$this->db->dbprefix("eventi")." WHERE id_evento = " . $this->db->escape($id));
    }
    function media_di($id) {
	    return $this->db->query("SELECT * FROM ".$this->db->dbprefix("eventi")." e, ".$this->db->dbprefix("media_eventi")." m WHERE e.id_evento = m.id_evento AND e.id_evento = " . $this->db->escape($id));
    }


    function raccomandati($amici_noti, $categoria, $chiave, $data_inizio, $data_fine)
    {
	    if (count($amici_noti) == 0)
		    return null;
	    $qstr = 'SELECT r.id_evento, COUNT(*) AS numero_partecipanti, e.* ';
	    $qstr .= 'FROM '.$this->db->dbprefix('reservations').' r, ' . $this->db->dbprefix('eventi'). ' e ';
	    $qstr .= 'WHERE (r.id_utente = '.$this->db->escape($amici_noti[0]);
	    for ($i = 1; $i < count($amici_noti); $i++)
		    $qstr .= ' OR r.id_utente = ' . $this->db->escape($amici_noti[$i]);
	    $qstr .= ') AND r.id_evento = e.id_evento ';
	    if ($categoria)
		    $qstr .= 'AND categoria = '.$this->db->escape(strtolower($categoria)).' ';
	    if ($chiave) {
		    $t = $this->db->escape_like_str($chiave);
		    $qstr .= 'AND ((nome LIKE "%' . $t . '%") OR (descrizione LIKE "%'.$t.'%")) ';
	    }
	    $qstr .= ' AND ' . $this->condizione_data($data_inizio, $data_fine);
	    $qstr .= 'GROUP BY r.id_evento ORDER BY numero_partecipanti DESC, e.start_time ASC LIMIT 4';
	    return $this->db->query($qstr)->result_array();
    }
}
